﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Collections.Specialized;

namespace Montana
{
    public class GestionFormularios
    {
        private static HybridDictionary formsInicializados = new HybridDictionary();
        private static Form formPrincipalMDI;
        

        #region Enumeradores
        public enum EstadosForm
        {
            Inicial,
            Insercion,
            Modificacion,
            Busqueda,
            Cobro
        }
        #endregion

        #region Set Form Principal MDI
        public static void SetFormPrincipalMDI(Form frmPrincipal)
        {
            formPrincipalMDI = frmPrincipal;
        }
        #endregion

        #region Abrir Formulario
        public static void AbrirFormulario(Type formType)
        {
            if (EstaCargado(formType))
            {
                ActivarFormAbierto(formType.ToString());
                return;
            }

            MarcarComoAbierto(formType);
            Form frm = (Form)Activator.CreateInstance(formType);
            frm.MdiParent = formPrincipalMDI;
            frm.StartPosition = FormStartPosition.CenterParent;
            frm.Closed += new EventHandler(FormClosed);
            frm.Show();

        }
        #endregion

        #region Activar Form Abierto
        private static void ActivarFormAbierto(string formToLoadName) 
        {
            foreach (Form frmChild in formPrincipalMDI.MdiChildren) 
            {
                if (frmChild.GetType().ToString() == formToLoadName) 
                { //encuentro la instancia abierta
                    frmChild.Activate(); //lo traigo al frente
                    return ;
                } 
            }
        }
        #endregion

        #region Obtener Instancia Formulario
        //metodo que devuelve la instancia del formulario que entra por parametro o null si no existe
        public static Form ObtenerInstanciaFormulario(string nombreFormulario)
        {
            foreach (Form frmChild in formPrincipalMDI.MdiChildren)
            {
                if (frmChild.Name == nombreFormulario)
                {
                    return frmChild;
                }
            }
            //si llega hasta acá es xq el form no está abierto y devuelve null;
            return null;
        }
        #endregion

        #region Cerrar Todos
        //metodo que cierra todas las instancias de todos los formularios abiertos
        public static void CerrarTodos()
        {
            foreach (Form frmChild in formPrincipalMDI.MdiChildren)
            {
                frmChild.Close();
            }
        }
        #endregion

        #region Marcar Como Abierto

        private static void MarcarComoAbierto(Type formType)
        {
            formsInicializados[formType.Name] = true;
        }
        #endregion

        #region Marcar Como Cerrado
        private static void MarcarComoCerrado(Type formType)
        {
            formsInicializados[formType.Name] = false;
        }
        #endregion

        #region Esta Cargado
        private static bool EstaCargado(Type formType)
        {
            return ((formsInicializados[formType.Name] != null) &&

                  (bool)formsInicializados[formType.Name] == true);
        }
        #endregion

        #region Form Closed
        private static void FormClosed(object sender, EventArgs e)
        {
            Form formCerrando = (Form)sender;
            formCerrando.Closed -= new EventHandler(FormClosed);
            MarcarComoCerrado(sender.GetType());
        }
        #endregion

        #region Validar Acceso
        public static bool ValidarAcceso(string nombreFormulario)
        {
            if (Application.OpenForms.Count > 0)
            {
               frmPrincipal ventanaPrincipal = ((frmPrincipal)Application.OpenForms[0]);
               //Usuarios usuarioLogueado = ventanaPrincipal.usuarioLogueado;
               //Perfil objPerfil = AdmPerfil.ObtenerPerfilPorId(usuarioLogueado.IdPerfil);
               // PermisoXPerfil permiso = AdmPermisoXPerfil.ObtenerPermisoXPerfilPorId(nombreFormulario, objPerfil.Nombre);
               // if (permiso != null)
               // {
                    return true;
                //}
                //else
                //{
                //    return false;
                //}
            }
            else
            {
                return false;
            }

        }
        #endregion
    }

}
